home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 23
/
Amiga Format AFCD23 (Feb 1998, Issue 107).iso
/
+look_here_1st!+
/
reader_requests
/
alienbreed3d2
/
cheesesauce
/
cd.s
< prev
next >
Wrap
Text File
|
1997-11-28
|
4KB
|
364 lines
;
; cd.s - cd player for AB3D (C)opyright 1995 Team17 Ltd - Charlie
; $Log: $
;
;
opt O+,P=68020
include "workbench:utilities/devpac/system.gs"
; INCLUDE utils:sysinc/exec_lib.i ; change this for your path!.
INCLUDE utils:sysinc/exec/io.i
INCLUDE utils:sysinc/devices/cd.i
INCLUDE utils:sysinc/exec/lists.i
_test
bsr _InitCD
move.l d0,doneit
tst.l d0
beq.s .BadOpen
moveq #1,d0
bsr _PlayCD
.waitforstop:
btst #6,$bfe001
bne.s .waitforstop
bsr _StopCD
bsr _CloseCD
moveq #0,d0
.BadOpen
rts
; end test routine..
doneit: dc.l 0
XDEF _InitCD
_InitCD
; setup execbase
lea Data(pc),a4
move.l 4.w,_ExecBase-Data(a4)
move.l _ExecBase(pc),a6
; setup port
sub.l a0,a0
moveq #0,d0
jsr _CreatePort
tst.l d0
beq.b .PortError
move.l d0,_CDPort-Data(a4) ; MsgPort for cd.device
; Create first extended io port
move.l d0,a0
moveq #IOSTD_SIZE,d0 ; sizeof strct IORequest
jsr _CreateExtIO
tst.l d0
beq.b .PortError
move.l d0,_CDReq0-Data(a4)
; Create second extended io port
move.l _CDPort(pc),a0
moveq #IOSTD_SIZE,d0
jsr _CreateExtIO
tst.l d0
beq.b .PortError
move.l d0,_CDReq1-Data(a4) ; second EXTIO
; open device..
lea _CDDev(pc),a0
moveq #0,d0 ; unit number
move.l _CDReq0(pc),a1
moveq #0,d1 ; flags.
jsr _LVOOpenDevice(a6)
tst.l d0
beq.b .PortOk
bra.b .PortError
.PortOk
move.l _CDReq0(pc),a0
move.l _CDReq0(pc),a1
; copy _CDReq0 -> _CDReq1
moveq #20/4,d0
.loop
move.l (a0),(a1)
dbra d0,.loop
moveq #1,d0 ; return value
move.l d0,_CDAvail-Data(a4)
rts
.PortError
moveq #0,d0 ; return value for error..
move.l d0,_CDAvail-Data(a4)
rts
XDEF _PlayCD
_PlayCD
lea Data(pc),a4
cmp.l #0,_CDAvail-Data(a4)
bne.b .CDOk
moveq #0,d0
rts
.CDOk
move.l d0,-(sp)
; kill any current activity..
bsr.b _StopCD
move.l _CDReq0(pc),a1
move.w #CD_PLAYTRACK,IO_COMMAND(a1)
move.l (sp)+,d0
move.l d0,IO_OFFSET(a1) ; play from
move.l #1,IO_LENGTH(a1) ; number of tracks to play for
move.l _ExecBase(pc),a6
jsr _LVOSendIO(a6)
rts
XDEF _StopCD
_StopCD
lea Data(pc),a4
; check if CDReq0 is being used or not...
move.l _CDReq0(pc),a1
move.l _ExecBase(pc),a6
jsr _LVOCheckIO(a6)
tst.l d0
bne.b .NotUsed
jsr _LVOAbortIO(a6)
.NotUsed
rts
XDEF _CloseCD
_CloseCD
move.l _CDReq0(pc),a1
move.l _ExecBase(pc),a6
jsr _LVOCloseDevice(a6)
move.l _CDReq0(pc),a0
jsr _DeleteExtIO
rts
XDEF _CDPos
_CDPos
lea Data(pc),a4
; check if CDReq0 is being used or not...
move.l _CDReq0(pc),a1
move.l _ExecBase(pc),a6
jsr _LVOCheckIO(a6)
tst.l d0
bne.b .NotUsed
moveq #-1,d0
.NotUsed
rts
_CreatePort
movem.l d2-d5/a2,-(sp)
move.l $18(sp),d3
move.b $1F(sp),d2
moveq #-1,d5
move.l d5,d0
move.l _ExecBase(pc),a6
jsr _LVOAllocSignal(a6)
move.l d0,d4
ble.s .L6
move.l #$10001,d1
moveq #$22,d0
jsr _LVOAllocMem(a6)
move.l d0,a2
move.l a2,d5
beq.s .L7
move.l d3,10(a2)
move.b d2,9(a2)
move.b #4,8(a2)
clr.b 14(a2)
move.b d4,15(a2)
sub.l a1,a1
jsr _LVOFindTask(a6)
move.l d0,$10(a2)
tst.l d3
beq.s .L4
move.l a2,a1
jsr _LVOAddPort(a6)
bra.s .L12
.L4
move.l $14(a2),a0
NEWLIST a0
.L12
move.l a2,d0
bra.s .L1
.L7
move.l d4,d0
jsr _LVOFreeSignal(a6)
.L6
moveq #0,d0
.L1
movem.l (sp)+,d2-d5/a2
rts
_DeletePort
move.l a2,-(sp)
move.l 8(sp),a2
tst.l 10(a2)
beq.s .L14
move.l a2,a1
move.l _ExecBase(pc),a6
jsr _LVORemPort(a6)
.L14
move.b #$FF,8(a2)
moveq #-1,d0
move.l d0,$14(a2)
moveq #0,d0
move.b 15(a2),d0
jsr _LVOFreeSignal(a6)
move.l #$22,a1
move.l a2,d0
jsr _LVOFreeMem(a6)
move.l (sp)+,a2
rts
_CreateExtIO
movem.l d2-d4,-(sp)
move.l $10(sp),d2
move.l $14(sp),d3
tst.l d2
beq.s .L3
move.l #$10001,d1
move.l d3,d0
move.l _ExecBase(pc),a6
jsr _LVOAllocMem(a6)
move.l d0,a0
move.l a0,d4
beq.s .L3
move.b #7,8(a0)
move.w d3,$12(a0)
move.l d2,14(a0)
move.l a0,d0
bra.s .L1
.L3
moveq #0,d0
.L1
movem.l (sp)+,d2-d4
rts
_DeleteExtIO
move.l 4(sp),a0
move.l a0,d0
beq.s .L10
moveq #-1,d0
move.l d0,(a0)
moveq #-1,d0
move.l d0,$14(a0)
moveq #0,d0
move.w $12(a0),d0
move.l a0,a1
move.l _ExecBase(pc),a6
jsr _LVOFreeMem(a6)
.L10
rts
; Data Section
Data
CNOP 0,4
_ExecBase
dc.l 0
_CDAvail
dc.l 0
_CDPort
dc.l 0
_CDReq0
dc.l 0
_CDReq1
dc.l 0
_QCode
dcb.b 10000,0
_CDDev:
dc.b "cd.device",0
END